/* Temp workaround */
if (running_on_sim)
- dsi.xen_elf_image = 1;
+ dsi.xen_section_string = (char *)1;
- if ((!vmx_enabled) && !dsi.xen_elf_image) {
+ if ((!vmx_enabled) && !dsi.xen_section_string) {
printk("Lack of hardware support for unmodified vmx dom0\n");
panic("");
}
- if (vmx_enabled && !dsi.xen_elf_image) {
+ if (vmx_enabled && !dsi.xen_section_string) {
printk("Dom0 is vmx domain!\n");
vmx_dom0 = 1;
}
unsigned long _initrd_start, unsigned long initrd_len,
char *cmdline)
{
- int i, rc;
+ int i, rc, dom0_pae, xen_pae;
unsigned long pfn, mfn;
unsigned long nr_pages;
unsigned long nr_pt_pages;
unsigned long mpt_alloc;
extern void physdev_init_dom0(struct domain *);
- extern void translate_l2pgtable(struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn);
+ extern void translate_l2pgtable(
+ struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn);
/* Sanity! */
if ( d->domain_id != 0 )
if ( (rc = parseelfimage(&dsi)) != 0 )
return rc;
+ if ( dsi.xen_section_string == NULL )
+ {
+ printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
+ return -EINVAL;
+ }
+
+ dom0_pae = !!strstr(dsi.xen_section_string, "PAE=yes");
+ xen_pae = (CONFIG_PAGING_LEVELS == 3);
+ if ( dom0_pae != xen_pae )
+ {
+ printk("PAE mode mismatch between Xen and DOM0 (xen=%s, dom0=%s)\n",
+ xen_pae ? "yes" : "no", dom0_pae ? "yes" : "no");
+ return -EINVAL;
+ }
+
/* Align load address to 4MB boundary. */
dsi.v_start &= ~((1UL<<22)-1);
#include <xen/elf.h>
#include <xen/sched.h>
-#ifdef CONFIG_X86
-#define FORCE_XENELF_IMAGE 1
-#elif defined(__ia64__)
-#define FORCE_XENELF_IMAGE 0
-#endif
-
static void loadelfsymtab(struct domain_setup_info *dsi, int doload);
static inline int is_loadable_phdr(Elf_Phdr *phdr)
{
break;
}
- if ( guestinfo == NULL )
- {
- printk("Not a Xen-ELF image: '__xen_guest' section not found.\n");
- dsi->xen_elf_image = 0;
-#if FORCE_XENELF_IMAGE
- return -EINVAL;
-#endif
- } else {
- dsi->xen_elf_image = 1;
- }
+
+ dsi->xen_section_string = guestinfo;
for ( h = 0; h < ehdr->e_phnum; h++ )
{
unsigned long symtab_addr;
unsigned long symtab_len;
/* Indicate whether it's xen specific image */
- unsigned int xen_elf_image;
+ char *xen_section_string;
};
extern struct domain idle0_domain;